package com.demo.framework.utils;

import java.io.File;
import java.util.ArrayList;
import java.util.List;

import android.app.ActivityManager;
import android.content.Context;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.pm.PackageManager.NameNotFoundException;
import android.os.Debug;
import android.os.Environment;
import android.os.StatFs;
import android.provider.Settings;
import android.telephony.TelephonyManager;
import android.util.Log;

/**
 * 
* @ClassName: SystemInfoUtil 
* @Description: TODO(1、获取手机设备的信息包括（sim卡信息，ram大小，rom 大小，SDCard 大小
  2、手机安装的所有应用程序）
* 3、设置手机的时间与网络时间同步) 
* @author 谢云腾
* @date 2013-3-22 上午11:20:44 
* @version 1.0
 */
public class SystemInfoUtil {

    /**
     * 获取 sim 卡的一些信息，包括 手机号，IMEI,IMSI 运营商等信息
     * 
     * @param context
     * @return
     */
    public static String getSIMCardInfo(Context context) {
        if (context == null) {
            return null;
        }
        TelephonyManager tm = (TelephonyManager) context
                .getSystemService(context.TELEPHONY_SERVICE);
        StringBuilder sb = new StringBuilder();

        // 手机序列号 IMEI
        sb.append("\nDeviceId(IMEI) = " + tm.getDeviceId());
        /*
         * 唯一的用户ID： 例如：IMSI(国际移动用户识别码) for a GSM phone. 需要权限：READ_PHONE_STATE
         */
        sb.append("\nSubscriberId(IMSI) = " + tm.getSubscriberId());

        /*
         * 设备的软件版本号： 例如：the IMEI/SV(software version) for GSM phones.
         */
        sb.append("\nDeviceSoftwareVersion = " + tm.getDeviceSoftwareVersion());
        /*
         * 手机号： GSM手机的 MSISDN. Return null if it is unavailable.
         */
        sb.append("\nLine1Number = " + tm.getLine1Number());

        /*
         * 当前使用的网络类型： 例如： NETWORK_TYPE_UNKNOWN 网络类型未知 0 NETWORK_TYPE_GPRS GPRS网络
         * 1 NETWORK_TYPE_EDGE EDGE网络 2 NETWORK_TYPE_UMTS UMTS网络 3
         * NETWORK_TYPE_HSDPA HSDPA网络 8 NETWORK_TYPE_HSUPA HSUPA网络 9
         * NETWORK_TYPE_HSPA HSPA网络 10 NETWORK_TYPE_CDMA CDMA网络,IS95A 或 IS95B. 4
         * NETWORK_TYPE_EVDO_0 EVDO网络, revision 0. 5 NETWORK_TYPE_EVDO_A EVDO网络,
         * revision A. 6 NETWORK_TYPE_1xRTT 1xRTT网络 7
         */
        sb.append("\nNetworkType = " + tm.getNetworkType());
        /*
         * 手机类型： 例如： PHONE_TYPE_NONE 无信号 PHONE_TYPE_GSM GSM信号 PHONE_TYPE_CDMA
         * CDMA信号
         */
        sb.append("\nPhoneType = " + tm.getPhoneType());

        /*
         * 服务商名称： 例如：中国移动、联通 SIM卡的状态必须是 SIM_STATE_READY(使用getSimState()判断).
         */
        sb.append("\nSimOperatorName = " + tm.getSimOperatorName());

        /*
         * SIM卡的序列号： 需要权限：READ_PHONE_STATE
         */
        sb.append("\nSimSerialNumber = " + tm.getSimSerialNumber());

        /*
         * SIM的状态信息： SIM_STATE_UNKNOWN 未知状态 0 SIM_STATE_ABSENT 没插卡 1
         * SIM_STATE_PIN_REQUIRED 锁定状态，需要用户的PIN码解锁 2 SIM_STATE_PUK_REQUIRED
         * 锁定状态，需要用户的PUK码解锁 3 SIM_STATE_NETWORK_LOCKED 锁定状态，需要网络的PIN码解锁 4
         * SIM_STATE_READY 就绪状态 5
         */
        sb.append("\nSimState = " + tm.getSimState());

        return sb.toString();

    }

    /**
     * Rom内存大小
     * 
     * @return
     */
    public long[] getRomMemroy() {
        long[] romInfo = new long[2];
        // Total rom memory
        romInfo[0] = getTotalInternalMemorySize();

        // Available rom memory
        File path = Environment.getDataDirectory();
        StatFs stat = new StatFs(path.getPath());
        long blockSize = stat.getBlockSize();
        long availableBlocks = stat.getAvailableBlocks();
        romInfo[1] = blockSize * availableBlocks;
        return romInfo;
    }

    public long getTotalInternalMemorySize() {
        File path = Environment.getDataDirectory();
        StatFs stat = new StatFs(path.getPath());
        long blockSize = stat.getBlockSize();
        long totalBlocks = stat.getBlockCount();
        return totalBlocks * blockSize;
    }

    /**
     * 获取当前剩余内存(ram)大小的方法：
     * 
     * @param mContext
     * @return
     */
    public long getAvailMemory(Context mContext) {
        ActivityManager am = (ActivityManager) mContext
                .getSystemService(Context.ACTIVITY_SERVICE);
        ActivityManager.MemoryInfo mi = new ActivityManager.MemoryInfo();
        am.getMemoryInfo(mi);
        return mi.availMem;
    }

    /**
     * 获取SDCard 的大小
     * 
     * @return
     */
    public long[] getSDCardMemory() {
        long[] sdCardInfo = new long[2];
        String state = Environment.getExternalStorageState();
        if (Environment.MEDIA_MOUNTED.equals(state)) {
            File sdcardDir = Environment.getExternalStorageDirectory();
            StatFs sf = new StatFs(sdcardDir.getPath());
            long bSize = sf.getBlockSize();
            long bCount = sf.getBlockCount();
            long availBlocks = sf.getAvailableBlocks();

            sdCardInfo[0] = bSize * bCount;// 总大小
            sdCardInfo[1] = bSize * availBlocks;// 可用大小
        }
        return sdCardInfo;
    }

    /**
     * 查询手机内非系统应用
     * 
     * @param context
     * @return
     */
    public static List<PackageInfo> getAllApps(Context context) {
        List<PackageInfo> apps = new ArrayList<PackageInfo>();
        PackageManager pManager = context.getPackageManager();
        // 获取手机内所有应用
        List<PackageInfo> paklist = pManager.getInstalledPackages(0);
        for (int i = 0; i < paklist.size(); i++) {
            PackageInfo pak = (PackageInfo) paklist.get(i);
            // 判断是否为非系统预装的应用程序
            if ((pak.applicationInfo.flags & pak.applicationInfo.FLAG_SYSTEM) <= 0) {
                // customs applications
                apps.add(pak);
            }
        }
        return apps;
    }
    
    /**
     * 检查手机设置中的日期与时间是否与网络同步的
     * @param context
     */
    
    public static void checkTimeSync(Context context) {
        String s = Settings.System.getString(context.getContentResolver(), android.provider.Settings.System.AUTO_TIME);
        if (s != null && s.equals("0")) {
            boolean isSuccess = Settings.System.putString(context.getContentResolver(), android.provider.Settings.System.AUTO_TIME, "1");
            if (isSuccess) {// 设置成功
            } else {// 采用第二种方案
            }
        }
    }
    
    /**
     *  
    * @Title: getCurrentVersionCode 
    * @Description: TODO(获取系统版本号) 
    * @param @param context
    * @param @return
    * @return int    返回类型 
    * @throws
     */
    public static int getCurrentVersionCode(Context context){
        int nVerCode = -1;
        try{
            nVerCode = context.getPackageManager().getPackageInfo(context.getPackageName(), 0).versionCode;
        }catch (NameNotFoundException e) {
//            Log.e(TAG, "获取versionCode错误", e);
        }
        return nVerCode;
    }
}
